<?php
/**
 * @brief Klasa mapująca dane z bazy danych na obiekty klasy encyjnej Application_Model_Auction
 *
 * Obiekty tej klasy pośredniczą wymianie danych między bazą danych a obiektami klasy encyjnej Auction.
 * Za pomocą metod z przypisanej klasy tabeli tworzą obiekty na podstawie danych z bazy danych 
 * oraz zapisują informacje z obiektów do bazy danych.
 */
class Application_Model_AuctionMapper
{
    protected $_dbTable; /*!<  Klasa tabeli */

    /**
     * @brief @brief Metoda do ustawiania klasy tabel o podanej nazwie.
     * 
     * @param string $dbTable
     * @return Application_Model_AuctionMapper 
     */
    public function setDbTable($dbTable) {

        if (is_string($dbTable)) {

            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) {

            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }
    
    /**
     * @brief Metoda zwracająca klasę tabel.
     * 
     * @return Application_Model_DbTable_Auction
     */
    public function getDbTable() {

        if (null === $this->_dbTable) {

            $this->setDbTable('Application_Model_DbTable_Auction');
        }

        return $this->_dbTable;
    }
    
    /**
     * @brief Metoda zapisująca informacje do bazy danych z obiektu reprezentującego aukcję.
     *
     * Metoda służy zarówno do tworzenia w bazie danych nowych rekordów, jak i aktualizacji starych.
     * Aktualizacja następuje w przypadku, gdy obiekt posiada już indywidualny identyfikator.
     * 
     * @param Application_Model_Auction $auction
     * @return int Identyfikator aukcji 
     */
    public function save(Application_Model_Auction $auction) { 

        $data = array(
            
            'MarketEntity_id'   =>  $auction->getMarketEntity_id(),
            'title'             =>  $auction->getTitle(),
            'description'       =>  $auction->getDescription(),
            'startTime'         =>  $auction->getStartTime(),
            'endTime'           =>  $auction->getEndTime(),
            'hiddenOffers'      =>  $auction->getHiddenOffers(),
            'duration'          =>  $auction->getDuration(),
            'isVisible'         =>  $auction->getIsVisible()
            
        );



        if (null === ($id = $auction->getAuction_id())) { 

            unset($data['Auction_id']);

            $newId = $this->getDbTable()->insert($data);
            return $newId;
        } else {

            $this->getDbTable()->update($data, array('Auction_id = ?' => $id)); 
            return $id;
        }
        
        
    }

    /**
     * @brief Metoda wyszukująca aukcję na podstawie identyfikatora.
     *
     * Metoda generuje pojedynczy obiekt reprezentujący aukcję na podstawie rekordu, o podanym 
     * identyfikatorze, znalezionego w bazie danych.
     * 
     * @param int $id
     * @return Application_Model_Auction 
     */
    public function find($id) { 
        
        $auction = new Application_Model_Auction;    
        $result = $this->getDbTable()->find($id);

        if (0 == count($result)) {

            return;
        }

        $row = $result->current();

        $auction->setAuction_id($row->Auction_id);
        $auction->setMarketEntity_id($row->MarketEntity_id);
        $auction->setDescription($row->description);
        $auction->setTitle($row->title);
        $auction->setStartTime($row->startTime);
        $auction->setEndTime($row->endTime);
        $auction->setHiddenOffers($row->hiddenOffers);
        $auction->setIsVisible($row->isVisible);
        $auction->setDuration($row->duration);
        
        return $auction;

    }

    /**
     * @brief Metoda wyszukująca zbiór aukcjina podstawie danych wejściowych.
     *
     * Metoda wyszukuje zbiór aukcji i zwraca tablicę obiektów Application_Model_Auction. 
     * Zbiór rekordów uzyskanych z klasy tabel jest przetwarzany przez inną metodę.
     * 
     * @param string $query
     * @return array Tablica obiektów klasy Application_Model_Auction.  
     */ 
    public function fetchAll($query = NULL) {
        if ($query === NULL) {
            $resultSet = $this->getDbTable()->fetchAll();
            
        } else {
            $table = $this->getDbTable();
            $select = $table->select();
            $select->from($table)
                    ->where($query);
                    //->order('endTime');

            $resultSet = $this->getDbTable()->fetchAll($select);
        }
        return $this->processResultSet($resultSet);
    }
	
    /**
     * @brief Metoda przetwarza rekordy na obiekty.
     * 
     * @param Zend_Db_Table_Rowset $resultSet
     * @return array Application_Model_Auction 
     */
    private function processResultSet($resultSet) {
        $entries = array();
        foreach ($resultSet as $row) {

            $auction = new Application_Model_Auction();

            $auction->setAuction_id($row->Auction_id);
            $auction->setMarketEntity_id($row->MarketEntity_id);
            $auction->setDescription($row->description);
            $auction->setTitle($row->title);
            $auction->setStartTime($row->startTime);
            $auction->setEndTime($row->endTime);
            $auction->setHiddenOffers($row->hiddenOffers);
            $auction->setIsVisible($row->isVisible);
            $auction->setDuration($row->duration);

            $entries[] = $auction;
        }
        return $entries;
    }
    
    
    public function fetchUserAuctionsByStatus($status, $user) {
        
        $db = Zend_Db_Table::getDefaultAdapter();
        $select = $db->select();
        $select->from(array('a'=>'auction'));
        $select->join(array('o'=>'offer'),'a.Auction_id = o.Auction_id');
        $select->where('o.MarketEntity_id = ?',$user);
        $select->where('o.firstOffer = 1');
        if($status  == 'open') {
            $select->where('a.startTime < now() and a.endTime > now()');
        } else {
            $select->where('a.endTime < now()');
        }
        $select->columns('MarketEntity_id', 'a');
        
        $resultSet = $db->fetchAll($select);
        $results = array();
        $auctions = array();
        foreach ($resultSet as $key=>$value) {
            if(!in_array($value['Auction_id'], $auctions)) {
                $auctions[] = $value['Auction_id'];
                $results[] = new Application_Model_Auction($value);
            }
            
        }
        //var_dump($resultSet);
        return $results;
    }
}

